package com.atguigu.completablefuture;

import java.util.Date;
import java.util.concurrent.*;

/**
 * @author wk
 * @create 2021-09-02 17:17
 * 测试异步编排
 */
public class CompletableFutureDemo3 {
    public static void main(String[] args) {
        // 创建异步对象
        // runAsync方法 无返回值 有两个重载的方法
        // 1. public static CompletableFuture<Void> runAsync(Runnable runnable)
        // 第一个参数为实现Runnable接口的实现类 第二个参数是线程池
        // 2.public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor)
        // 自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,// 核心线程数
                10,// 最大线程数
                5L, //空闲线程的存活时间
                TimeUnit.SECONDS,// 时间单位
                new LinkedBlockingQueue<>(10),// 工作队列
                Executors.defaultThreadFactory(),// 线程工厂
                new ThreadPoolExecutor.AbortPolicy()// 默认的拒绝策略 抛异常 阻止系统正常运行
        );
        CompletableFuture.supplyAsync(() -> {
            return "第一个任务";
            // 串行化
            // thenApplyAsync()方法 不仅接收上一个任务的返回值 同时也返回返回值给下一个任务
        }, threadPoolExecutor).thenApplyAsync((r) -> { //参数接收上一个任务的返回值
            System.out.println("接收上一个任务的返回值：" + r);
            System.out.println("当前任务");
            return "当前任务的返回值"; // 返回返回值给下一个任务
        }, threadPoolExecutor).whenCompleteAsync((a, b) -> {
            System.out.println("上一个任务的返回值：" + a);
            System.out.println("上一个任务的异常：" + b);
        }, threadPoolExecutor);
        System.out.println("****************************************************");
        CompletableFuture.supplyAsync(() -> {
            return "第一个任务" + new Date();
        }, threadPoolExecutor).thenAcceptAsync((t) -> { // 接收上一个任务的返回值 但不返回返回值
            System.out.println("接收上一个任务的返回值：" + t);
        }, threadPoolExecutor).thenRunAsync(()->{
            System.out.println("上一个任务执行完成就执行");
        },threadPoolExecutor);
    }
}
